package cda.memo;

import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.*;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main extends TabActivity{
    
    public static String                        TYPE = "EAN_13";
    public static String                        DONNEES = "1111111111141";
    
    // Le tabhost d'affichage
    private TabHost                             _tabHost_OngletsAffichage;
    
    // Bouton de choix de la catégorie
    private Button                              _button_ChoixCategorie;
    
    // Variable pour le memo
    private List<String[]>                      _listeCategorie;
    
    // Liste contenant les derniers items lu dans base de donnée
    private List<String[]>                      _items;
    
    // Handler pour sortir les messages de la partie static
    private static Handler                      _messageHandler;
    
    // Gestion des fichiers
    private GestionFichier                      _gestionFichier;
    
    // Ouverture d'une nouvelle activity
    private Intent                              _i;
    
    // Pour la boite de dialog 
    private AlertDialog.Builder                 _adb;
    
    // Acces a la base de donnees
    private ClientBDDMemo                           _bdd;
    
    // categorie seletionne
    private String[]                            _catSel = new String[2];
    
    // liste des items selectionne
    private ListView                            _listView_Items;
    
    // Création de la ArrayList qui nous permettra de remplire la listView
    private ArrayList<String>                   _listeItemsTransfert = new ArrayList<String>();
    
    // Gestion de la liste des items
    private List<String>                        _listeItems;
    private ArrayAdapter<String>                _aa;
    
    // valeur pour l'handler pour categorie
    private final int                           HANDCAT=1; 
    
    // valeur pour l'handler pour item
    private final int                           HANDITEM=2;     
    
    
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        _aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, _listeItemsTransfert);

        _listeCategorie = new ArrayList<String[]>();

        _bdd = new ClientBDDMemo();

        _items = new ArrayList<String[]>();

        _listeItems = new ArrayList<String>();

        _tabHost_OngletsAffichage = getTabHost();

        _gestionFichier = new GestionFichier();

        _tabHost_OngletsAffichage.addTab(_tabHost_OngletsAffichage.newTabSpec("tab1").setIndicator("test 1").setContent(R.id.rel1));
        _tabHost_OngletsAffichage.addTab(_tabHost_OngletsAffichage.newTabSpec("tab2").setIndicator("test 2").setContent(R.id.rel2));
        _tabHost_OngletsAffichage.addTab(_tabHost_OngletsAffichage.newTabSpec("tab3").setIndicator("test 3").setContent(R.id.rel3));
        _tabHost_OngletsAffichage.addTab(_tabHost_OngletsAffichage.newTabSpec("tab4").setIndicator("test 4").setContent(R.id.rel4));

        _tabHost_OngletsAffichage.setCurrentTab(0);

        _listView_Items = (ListView) findViewById(R.id.liste_memo);

        _button_ChoixCategorie = (Button) findViewById(R.id.memo_liste);
        _button_ChoixCategorie.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                initListeMemoChooser();
            }
        });

        _messageHandler = new Handler() {

            @Override
            public void handleMessage(android.os.Message msg) {
                Log.e("memo", "handle");
                int tmp = msg.arg1;

                //Partie categorie
                if (tmp == HANDCAT) {
                    if (msg.obj.toString().equals("Créer categorie...")) {
                        //Toast.makeText(getApplicationContext(), "creer", Toast.LENGTH_SHORT).show();
                        initDialog();
                        _adb.show();
                    } else {

                        _button_ChoixCategorie.setText(msg.obj.toString());
                       
                        initListeItem(_catSel);


                        _listView_Items.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                            @Override
                            @SuppressWarnings("unchecked")
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                Log.e("memo", "Click court");
                                String temp = (String) parent.getItemAtPosition(position);
                                if (temp.equals("Creer objet...")) {
                                    Message msg = new Message();
                                    msg.obj = temp;
                                    msg.arg1 = HANDITEM;
                                    _messageHandler.sendMessage(msg);
                                }
                            }
                        });

                        _listView_Items.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

                            @Override
                            @SuppressWarnings("unchecked")
                            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                                Log.e("memo", "Long click");
                                String i = _items.get(position)[0];
                                initDialogAfficheObjet(i);
                                _adb.show();
                                return true;
                            }
                        });

                    }

                    //partie item
                } else if (tmp == HANDITEM) {
                    if (msg.obj.toString().equals("Creer objet...")) {
                        initDialogObjet();
                        _adb.show();
                    } else {
                        String[] objet = (String[]) msg.obj;
                        if (objet.length == 5) {
                            Log.e("memo", "Ajout");
                            _bdd.addItem(_catSel[0], objet);
                        } else {
                            Log.e("memo", "Modif");
                            _bdd.modifItem(_catSel[0], objet);
                        }

                    }

                }
                MAJAffichage();
                Log.e("memo", "fin handle");
            }
        };
        try {
            _gestionFichier.verifFichier();
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Affichage de la liste de catégorie.
     *
     * @author Jessy Bonnotte
     */
    private void initListeMemoChooser() {
        Log.e("memo", "initListeMemoChooser");
        initMemoCat();
        final int taille = _listeCategorie.size() + 1;
        //Toast.makeText(getApplicationContext(), String.valueOf(taille), Toast.LENGTH_SHORT).show();
        final CharSequence[] items = new CharSequence[taille];
        
        for (int i = 0; i < taille - 1; i++) {
            items[i] = _listeCategorie.get(i)[1];
        }
        items[taille - 1] = "Créer categorie...";
        
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Choisissez une catégorie");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            
            public void onClick(DialogInterface dialogInterface, int item) {
                Message msg = new Message();
                msg.arg1 = HANDCAT;
                msg.obj = items[item];
                if (item < taille - 1) {
                    _catSel[0] = _listeCategorie.get(item)[0];
                    _catSel[1] = _listeCategorie.get(item)[1];
                }
                _messageHandler.sendMessage(msg);
            }
        });
        builder.create().show();
        Log.e("memo", "fin initListeMemoChooser");
    }
    
    
    
    /**
     * Affichage de la liste d'item.
     *
     * @author Damien Henry
     */
    private void initListeItem(String[] cat) {
        Log.e("memo", "initListeItem");
        initMemoItem(cat);
        
        final int taille = _items.size() + 1;
        Log.v("Jessy", taille+"");
        _listeItems = new ArrayList<String>();
        
        for (int i = 0; i < taille - 1; ++i) {
            _listeItems.add(_items.get(i)[1]);
            Log.v("Jessy", _items.get(i)[0]+" "+_items.get(i)[1]+" "+_items.get(i)[2]+" "+_items.get(i)[3]+" "+_items.get(i)[4]+" ");
        }
        _listeItems.add("Creer objet...");
        
        
        
        Log.e("memo", "fin initListeItem");
    }

    /**
     * Fonction permettant d'initialiser la boite de dialoque pour la création
     * d'une catégorie
     *
     * @author Jessy Bonnotte
     *
     * @return boolean - resultat de l'initialisation de la dialogBox
     */
    private boolean initDialog() {
        Log.e("memo", "initDialog");
        try {
            //On instancie notre layout en tant que View
            LayoutInflater factory = LayoutInflater.from(this);
            final View alertDialogView = factory.inflate(R.layout.popupcreatecategorie, null);



            //Liaison du xml
            final EditText nomCat = (EditText) alertDialogView.findViewById(R.id.nomcat);

            //Création de l'AlertDialog
            _adb = new AlertDialog.Builder(this);

            //On affecte la vue personnalisé que l'on a crée à notre AlertDialog
            _adb.setView(alertDialogView);

            //On donne un titre à l'AlertDialog
            _adb.setTitle("Créer catégorie");

            //On modifie l'icône de l'AlertDialog pour le fun ;)
            _adb.setIcon(R.drawable.add);

            //On affecte un bouton "OK" à notre AlertDialog et on lui affecte un évènement
            _adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    Message msg = new Message();
                    msg.arg1 = HANDCAT;
                    msg.obj = nomCat.getText().toString();
                    saveMemoCat(nomCat.getText().toString());
                    _messageHandler.sendMessage(msg);
                    dialog.cancel();
                }
            });

            //On crée un bouton "Annuler" à notre AlertDialog et on lui affecte un évènement
            _adb.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    //Lorsque l'on cliquera sur annuler on quittera l'application
                    dialog.cancel();
                }
            });
        } catch (Exception e) {
            return false;
        }
        Log.e("memo", "fin initDialog");
        return true;
    }
    
    
    /**
     * Fonction permettant d'initialiser la boite de dialogue pour la creation 
     * d'un item
     * 
     * @author Damien Henry
     * 
     * @return boolean - resultat de l'initialisation de la dialogBox
     */
    private boolean initDialogObjet() {
        Log.e("memo", "initDialogObjet");
        try {
            //On instancie notre layout en tant que View
            LayoutInflater factory = LayoutInflater.from(this);
            final View alertDialogView = factory.inflate(R.layout.popupajouteobjet, null);



            //Liaison du xml
            final EditText nomitem = (EditText) alertDialogView.findViewById(R.id.nomitem);
            final EditText ref = (EditText) alertDialogView.findViewById(R.id.ref);
            final DatePicker date = (DatePicker) alertDialogView.findViewById(R.id.dateachat);
            final EditText garantie = (EditText) alertDialogView.findViewById(R.id.garantie);
            final EditText lieu = (EditText) alertDialogView.findViewById(R.id.lieu);

            //Création de l'AlertDialog
            _adb = new AlertDialog.Builder(this);

            //On affecte la vue personnalisé que l'on a crée à notre AlertDialog
            _adb.setView(alertDialogView);

            //On donne un titre à l'AlertDialog
            _adb.setTitle("Ajout d'un objet");

            //On modifie l'icône de l'AlertDialog pour le fun ;)
            _adb.setIcon(R.drawable.add);

            //On affecte un bouton "OK" à notre AlertDialog et on lui affecte un évènement
            _adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    String[] objet = new String[5];
                    objet[0] = nomitem.getText().toString();
                    objet[1] = ref.getText().toString();
                    objet[2] = garantie.getText().toString();
                    objet[3] = lieu.getText().toString();
                    objet[4] = date.getDayOfMonth() + "/"+date.getMonth()+"/"+date.getYear();
                    Message msg = new Message();
                    msg.obj = objet;
                    msg.arg1 = HANDITEM;
                    _messageHandler.sendMessage(msg);
                    dialog.cancel();
                }
            });

            //On crée un bouton "Annuler" à notre AlertDialog et on lui affecte un évènement
            _adb.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    //Lorsque l'on cliquera sur annuler on quittera l'application
                    dialog.cancel();
                }
            });
        } catch (Exception e) {
            return false;
        }
        Log.e("memo", "fin initDialogObjet");
        return true;
    }

    
    /**
     * Fonction permettant d'initialiser la boite de dialogue pour l'affichage 
     * d'un item
     * 
     * @author Damien Henry
     * 
     * @param id identifiant de l'objet a afficher
     * 
     * @return boolean - resultat de l'initialisation de la dialogBox
     */
    private boolean initDialogAfficheObjet(final String id) {
        Log.e("memo", "initDialogAfficheObjet");
                
        //recuperation de l'item
        String[] item;
        boolean trouver = false;
        int i = 0;
        while (!trouver) {
            trouver=_items.get(i)[0].equals(id);
            ++i;
        }
        --i;
        item=_items .get(i);

        try {
            //On instancie notre layout en tant que View
            LayoutInflater factory = LayoutInflater.from(this);
            final View alertDialogView = factory.inflate(R.layout.popupajouteobjet, null);
            

            //Liaison du xml
            final EditText nomitem = (EditText) alertDialogView.findViewById(R.id.nomitem);
            final EditText ref = (EditText) alertDialogView.findViewById(R.id.ref);
            final DatePicker date = (DatePicker) alertDialogView.findViewById(R.id.dateachat);
            final EditText garantie = (EditText) alertDialogView.findViewById(R.id.garantie);
            final EditText lieu = (EditText) alertDialogView.findViewById(R.id.lieu);

            
            //Remplissage des cases
            StringTokenizer dat = new StringTokenizer(item[5], "/");
            int jour, mois, annee;
            jour=Integer.parseInt(dat.nextElement().toString());
            mois=Integer.parseInt(dat.nextElement().toString());
            annee=Integer.parseInt(dat.nextElement().toString());
            
            nomitem.setText(item[1]);
            ref.setText(item[2]);
            garantie.setText(item[3]);
            lieu.setText(item[4]);
            date.updateDate(annee, mois,jour);
            Log.e("memo", "case rempli");
            //Création de l'AlertDialog
            _adb = new AlertDialog.Builder(this);

            //On affecte la vue personnalisé que l'on a crée à notre AlertDialog
            _adb.setView(alertDialogView);

            //On donne un titre à l'AlertDialog
            _adb.setTitle("Ajout d'un objet");

            //On modifie l'icône de l'AlertDialog pour le fun ;)
            _adb.setIcon(R.drawable.add);

            //On affecte un bouton "OK" à notre AlertDialog et on lui affecte un évènement
            _adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    Log.e("memo","fonction");
                    String[] objet = new String[6];
                    objet[0]=id;
                    objet[1] = nomitem.getText().toString();
                    objet[2] = ref.getText().toString();
                    objet[3] = garantie.getText().toString();
                    objet[4] = lieu.getText().toString();
                    objet[5] = date.getDayOfMonth() + "/"+date.getMonth()+"/"+date.getYear();
                    Message msg = new Message();
                    msg.obj = objet;
                    msg.arg1 = HANDITEM;
                    _messageHandler.sendMessage(msg);
                    dialog.cancel();
                }
            });

            //On crée un bouton "Annuler" à notre AlertDialog et on lui affecte un évènement
            _adb.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                
                public void onClick(DialogInterface dialog, int which) {
                    //Lorsque l'on cliquera sur annuler on quittera l'application
                    dialog.cancel();
                }
            });
        } catch (Exception e) {
            return false;
        }
        Log.e("memo", "fin initDialogAfficheObjet");
        return true;
    }
    
    
    
    /**
     * Fonction permettant de récupérer la liste des catégorie stocké dans le
     * systeme de préference.
     *
     * @author Jessy Bonnotte
     */
    private void initMemoCat() {
        Log.e("memo", "initMemoCat");
        _listeCategorie = _bdd.getCategorie();
        Log.e("memo", "fin initMemoCat");
    }

    /**
     * Fonction permettant de récuperer la liste des items correspondant a la
     * categorie stocké dans le fichier
     *
     * @autor Damien Henry
     */
    private void initMemoItem(String[] cat) {
        Log.e("memo", "initMemoItem");
        _items = _bdd.getItem(cat);
        Log.e("memo", "fin initMemoItem");
        
    }

    /**
     * Fonction permettant d'enregistrer les catégorie dans le systeme de
     * préférence.
     *
     * @author Jessy Bonnotte
     */
    private void saveMemoCat(String nomCat) {
        _catSel[0]=_bdd.addCategorie(nomCat);
        _catSel[1]=nomCat;
    }

    /**
     * Mise à jour du tableau des parties disponible grace a la liste de tableau
     * de string récupérer grace a l analyseur de trame.
     *
     * @author Jessy Bonnotte
     */
    private void MAJAffichage() {
        Log.e("memo", "MAJ");
        initListeItem(_catSel);
        _listeItemsTransfert.clear();
        Iterator<String> iterator = _listeItems.iterator();
        while (iterator.hasNext()) {
            _listeItemsTransfert.add(iterator.next());
        }
        _listView_Items.setAdapter(_aa);
        _aa.notifyDataSetChanged();
        initListeItem(_catSel);
        Log.e("memo", "fin MAJ");
    }
}
